<?
class imageEditor extends gravy{
	
	public $fileIsPath=true;

	public function __construct(){
		parent::__construct();
	}

	public function scaleToMaximumDimensions($file,$width,$height,$force_resize=false){
		$result=false;
		if($file=$this->getFileSystemFileName($file)){
			#$this->debug("YEAH!!",$file);
			if($newFileName=$this->appendToFileName($file,"_".$width."x".$height)){
				if($this->__resizeImage($file,$width,$height,true,false,$newFileName,false,false,$force_resize)){
					$result=str_replace(FULL_WEB_ROOT,WEB_URL,$newFileName);
				}
			}
		}else{
			$this->debug("BAH!!",$file);
		}
		return($result);
	}

	public function scaleImageByWidth($file,$width,$force_resize=false){
		$result=false;
		if($file=$this->getFileSystemFileName($file)){
			#$this->debug("YEAH!!",$file);
			if($newFileName=$this->appendToFileName($file,"_".$width."x")){
				if($this->__resizeImage($file,$width,0,true,false,$newFileName,false,false,$force_resize)){
					$result=str_replace(FULL_WEB_ROOT,WEB_ROOT,$newFileName);
				}
			}
		}else{
			#$this->debug("BAH!!",$file);
		}
		return($result);
	}

	public function scaleImageByHeight($file,$height,$force_resize=false){
		$result=false;
		if($file=$this->getFileSystemFileName($file)){
			#$this->debug("YEAH!!",$file);
			if($newFileName=$this->appendToFileName($file,"_x".$height)){
				if($this->__resizeImage($file,0,$height,true,false,$newFileName,false,false,$force_resize)){
					$result=str_replace(FULL_WEB_ROOT,WEB_ROOT,$newFileName);
				}
			}
		}else{
			#$this->debug("BAH!!",$file);
		}
		return($result);
	}

	public function getFileSystemFileName($file){
		$result=false;
		$tmp="";
			#$this->debug("YEAH!!",FULL_WEB_ROOT.$file);
		if($this->fileIsPath&&file_exists(FULL_WEB_ROOT.$file)){
			#$this->debug("YEAH!!",$file);
			$result=FULL_WEB_ROOT.$file;
		}elseif(file_exists($file)){
			$result=$file;
		}elseif(file_exists(FULL_WEB_ROOT.$this->config->uploadsPath.$file)){
			$result=FULL_WEB_ROOT.$this->config->uploadsPath.$file;
		}elseif(strpos($file,"/")>-1){
			$tmp=split("/",$file);
			$file=$tmp[count($tmp)-1];
			if(file_exists($file)){
				$result=$file;
			}elseif(file_exists(FULL_WEB_ROOT.$this->config->uploadsPath.$file)){
				$result=FULL_WEB_ROOT.$this->config->uploadsPath.$file;
			}
		}
		return($result);
	}

	public function appendToFileName($file,$text){
		$result=false;
		if(substr_count($file,".")==1){
			//$result=strrev($file);
			//$result=split(".",$result,1);
			//$result=$result[1].".".strrev($text).$result[0];
			//$result=strrev($result);
			$result=str_replace(".","$text.",$file);
		}
		return($result);
	}
	
	private function __resizeImage($file,$width=0,$height=0,$proportional=false,$crop=false,$output='fileName.ext',$delete_original=true,$use_linux_commands=false,$force_resize=false){
		if($height<=0&&$width<=0){
			return(false);
		}
		if(!file_exists($file)){
			return(false);
		}
		if(file_exists($output)){
			return(true);
		}

		$info=getimagesize($file);
		$image='';

		$final_width=0;
		$final_height=0;
		list($width_old,$height_old)=$info;

		if(!$force_resize&&$width_old<$width&&$height_old<$height){
			copy($file,$output);
			return(true);
		}
		
		if ($proportional) {
			if($width==0){
				$factor=$height/$height_old;
			}elseif($height==0){
				$factor=$width/$width_old;
			}else{
				$factor=min($width/$width_old,$height/$height_old);
			}   
			$final_width=round($width_old*$factor);
			$final_height=round($height_old*$factor);
		}else{
			$final_width=($width<=0)?$width_old:$width;
			$final_height=($height<=0)?$height_old:$height;
		}

		/* Start of new Code */
		$int_width=0;
		$int_height=0;

		$adjusted_height=$final_height;
		$adjusted_width=$final_width;

		if($crop){
			$wm=$width_old/$width;
			$hm=$height_old/$height;
			$h_height=$height/2;
			$w_height=$width/2;

			$ratio=$width/$height;
			$old_img_ratio=$width_old/$height_old;

			if($old_img_ratio>$ratio){
				$adjusted_width=$width_old/$hm;
				$half_width=$adjusted_width/2;
				$int_width=$half_width-$w_height;
			}elseif($old_img_ratio<=$ratio){
				$adjusted_height=$height_old/$wm;
				$half_height=$adjusted_height / 2;
				$int_height=$half_height-$h_height;
			}
		}

		/* End new code */

		switch($info[2]){
			case IMAGETYPE_GIF:
				$image=imagecreatefromgif($file);
				break;
			case IMAGETYPE_JPEG:
				$image=imagecreatefromjpeg($file);
				break;
			case IMAGETYPE_PNG:
				$image=imagecreatefrompng($file);
				break;
			default:
				return(false);
		}

		$image_resized=imagecreatetruecolor($final_width,$final_height);

		if(($info[2]==IMAGETYPE_GIF)||($info[2]==IMAGETYPE_PNG)){
			$trnprt_indx=imagecolortransparent($image);

			// If we have a specific transparent color
			if($trnprt_indx>=0){
				// Get the original image's transparent color's RGB values
				$trnprt_color=imagecolorsforindex($image,$trnprt_indx);

				// Allocate the same color in the new image resource
				$trnprt_indx=imagecolorallocate($image_resized,$trnprt_color['red'],$trnprt_color['green'],$trnprt_color['blue']);

				// Completely fill the background of the new image with allocated color.
				imagefill($image_resized,0,0,$trnprt_indx);

				// Set the background color for new image to transparent
				imagecolortransparent($image_resized,$trnprt_indx);
			}elseif($info[2]==IMAGETYPE_PNG){
				// Always make a transparent background color for PNGs that don't have one allocated already
				// Turn off transparency blending (temporarily)
				imagealphablending($image_resized,false);
	
				// Create a new transparent color for image
				$color=imagecolorallocatealpha($image_resized,0,0,0,127);
	
				// Completely fill the background of the new image with allocated color.
				imagefill($image_resized,0,0,$color);
				
				// Restore transparency blending
				imagesavealpha($image_resized,true);
			}
		}
		
		imagecopyresampled($image_resized,$image,-$int_width,-$int_height,0,0,$adjusted_width,$adjusted_height,$width_old,$height_old);

		if($delete_original){
			if($use_linux_commands){
				exec('rm '.$file);
			}else{
				@unlink($file);
			}
		}
		
		switch(strtolower($output)){
			case 'browser':
				$mime=image_type_to_mime_type($info[2]);
				header("Content-type: $mime");
				$output=NULL;
				break;
			case 'file':
				$output=$file;
				break;
			case 'return':
				return($image_resized);
				break;
			default:
				break;
		}
		
		switch($info[2]){
			case IMAGETYPE_GIF:
				imagegif($image_resized, $output);
				break;
			case IMAGETYPE_JPEG:
				imagejpeg($image_resized, $output);
				break;
			case IMAGETYPE_PNG:
				imagepng($image_resized, $output);
				break;
			default:
				return(false);
		}
		return(true);
	}
};
?>